package HongPro;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

//클라이언트로부터 전송된 문자열을 받아서 다른 클라이언트에게 문자열을 보내주는 스레드
class EchoThread extends Thread {
	Socket socket;
	Vector<Socket> vec;

	public EchoThread(Socket socket, Vector<Socket> vec) {
		this.socket = socket;
		this.vec = vec;
	}

	public void run() {
		BufferedInputStream bin = null;

		try {
			bin = new BufferedInputStream(socket.getInputStream());
			String str = null;

			String sendString = "";
			int n = 0;
			while (true) {
				// 클라이언트로부터 문자열 받기
				byte b[] = new byte[255];
				n = bin.read(b);

				// 상대가 접속을 끊으면 break;
				if (n == -1) {
					// 벡터에서 없애기
					vec.remove(socket);
					break;
				}
				// 연결된 소켓들을 통해서 다른 클라이언트에게 문자열 보내주기
				sendMsg(b);
			}

		} catch (IOException ie) {
			System.out.println(ie.getMessage());
		} finally {
			try {
				if (bin != null)
					bin.close();
				if (socket != null) {
					System.out.println("socketclose");
					socket.close();
				}
			} catch (IOException ie) {
				System.out.println(ie.getMessage());
			}
		}
	}

	// 전송받은 문자열 다른 클라이언트들에게 보내주는 메서드
	public void sendMsg(byte b[]) {
		try {
			for (Socket socket : vec) {
				// for을 돌면서 현재의 socket이 데이터를 보낸 클라이언트인 경우를 제외하고, 나머지 socket에게만
				// 데이터 전송
				if (socket != this.socket) {
					BufferedOutputStream bout = new BufferedOutputStream(
							socket.getOutputStream());
					bout.write(b);
					bout.flush();
				}
			}
		} catch (IOException ie) {
			System.out.println(ie.getMessage());
		}
	}
}

public class MultiChatServer {
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		// Ŭ���̾�Ʈ�� ����� ���ϵ��� �迭ó�� ������ ���Ͱ�ü ����
		Vector<Socket> vec = new Vector<Socket>();
		try {
			server = new ServerSocket(3000);
			while (true) {
				System.out.println("접속대기중");
				socket = server.accept();
				// 클라이언트와 연결된 소켓을 벡터에 담는작업
				vec.add(socket);
				// 스레드 구동
				new EchoThread(socket, vec).start();
			}
		} catch (IOException ie) {
			System.out.println(ie.getMessage());
		}
	}
}
